#pragma once

#include <iostream>
#include <string>
#include <sys/stat.h>
#include <fstream>
#include <vector>

namespace ns_util
{
    const std::string temp_path = "./temp/";

    class PathUtil
    {
    public:
        PathUtil()
        {
        }
        ~PathUtil()
        {
        }

        static std::string AddSuffix(const std::string &file_name, const std::string &suffix)
        {
            std::string path_name = temp_path;
            path_name += file_name;
            path_name += suffix;
            return path_name;
        }

        static std::string Src(const std::string &file_name)
        {
            return AddSuffix(file_name, ".cpp");
        }
        static std::string Exe(const std::string &file_name)
        {
            return AddSuffix(file_name, ".exe");
        }

        static std::string CompileError(const std::string &file_name)
        {
            return AddSuffix(file_name, ".compile_error");
        }

        static std::string Stdin(const std::string &file_name)
        {
            return AddSuffix(file_name, ".stdin");
        }
        static std::string Stdout(const std::string &file_name)
        {
            return AddSuffix(file_name, ".stdout");
        }
        static std::string Stderror(const std::string &file_name)
        {
            return AddSuffix(file_name, ".stderror");
        }
    };

    class FileUtil
    {
    public:
        static bool IsFileExists(const std::string &path_name)
        {
            struct stat st;
            if(stat(path_name.c_str(), &st) == 0)
            {
                return true;
            }
            return false;
        }

        static std::string UniqFileName()
        {
        }

        static bool WriteFile(const std::string &target, const std::string &content)
        {
        }

        static bool ReadFile(const std::string &target, std::string *content, bool keep = false)
        {
        }
    };

    class StringUtil
    {
    public:
        static void SplitString(const std::string &str, std::vector<std::string> *target, const std::string &sep)
        {
        }
    };
}

// namespace ns_util
// {

//     const std::string temp_path = "./temp/";

//     class PathUtil
//     {
//     public:
//         PathUtil()
//         {
//         }
//         ~PathUtil()
//         {
//         }

//         static std::string AddSuffix(const std::string &file_name, const std::string &suffix)
//         {
//             std::string path_name = temp_path;
//             path_name += file_name;
//             path_name += suffix;
//             return path_name;
//         }
//         // 编译时需要有的临时文件
//         // 构建源文件路径+后缀的完整文件名
//         // 1234 -> ./temp/1234.cpp
//         static std::string Src(const std::string &file_name)
//         {
//             return AddSuffix(file_name, ".cpp");
//         }
//         // 构建可执行程序的完整路径+后缀名
//         static std::string Exe(const std::string &file_name)
//         {
//             return AddSuffix(file_name, ".exe");
//         }

//         static std::string CompilerError(const std::string &file_name)
//         {
//             return AddSuffix(file_name, ".compile_error");
//         }

//         // 运行时需要的临时文件
//         static std::string Stdin(const std::string &file_name)
//         {
//             return AddSuffix(file_name, ".stdin");
//         }
//         static std::string Stdout(const std::string &file_name)
//         {
//             return AddSuffix(file_name, ".stdout");
//         }
//         // 构建该程序对应的标准错误完整的路径+后缀名
//         static std::string Stderr(const std::string &file_name)
//         {
//             return AddSuffix(file_name, ".stderr");
//         }
//     };

//     class FileUtil
//     {
//     public:
//         static bool IsFileExists(const std::string &path_name)
//         {
//             struct stat st;
//             if (stat(path_name.c_str(), &st) == 0)
//             {
//                 // 获取属性成功，文件已经存在
//                 return true;
//             }
//             return false;
//         }

//         static std::string UniqFileName()
//         {
//         }

//         static bool WriteFile(const std::string &target, const std::string &content)
//         {
//         }

//         static bool ReadFile(const std::string &target, std::string *content, bool keep = false)
//         {
//         }
//     };

//     class StringUtil
//     {
//     public:
//         static void SplitString(const std::string &str, std::vector<std::string> *target, const std::string &sep)
//         {
//         }
//     };

// }